/**
 * Created by ldx on 2016-01-05.
 *
 * 本JS对应为系统管理下菜单管理界面
 *
 * 对应JSP为menu.jsp
 *
 * 截止4.19号，所有功能除读取为真实数据外，其余实现功能都为本地功能，没有连接上数据库进行操作
 */
define(["require", "jquery", "public/app"], function (require, $, app) {

    function Menu($container) {
        this._$container = $container;
        this._init();
    }

    /**
     * 初始化url地址
     * @private
     */
    Menu.prototype._initUrlPath = function () {
        this.urlPaths = {
            menuTree: app.urlBuild("/dirms/security/authority/findChildren"),//查询下级菜单
            saveMenu: app.urlBuild("/dirms/security/authority/"),//保存菜单
            removeMenu: app.urlBuild("/dirms/security/authority/{id}")//删除菜单
        }
    };

    /**
     * 初始化控件
     * @private
     */
    Menu.prototype._init = function () {
        this._initUrlPath();
        this._initMenuTree();//初始化菜单树
        this._initEventBinding();//初始化事件绑定
    };

    /**
     * 初始化菜单树
     * @private
     */
    Menu.prototype._initMenuTree = function () {
        var self = this;
        this._$container.find('#menu-tree').tree({
            url: this.urlPaths.menuTree,
            method: 'get',
            onSelect: function () {//选中节点时，在form中显示菜单信息
                var node = self._$container.find('#menu-tree').tree('getSelected');
                var parent = self._$container.find('#menu-tree').tree('getParent', node.target);
                self._$container.find('#menu-form').form('load', node);
                self._$container.find("#active").switchbutton(node.active ? "check" : "uncheck");//switchbutton无法通过form的load方法处理，自己写
                self._$container.find("#readOnly").switchbutton(node.readOnly ? "check" : "uncheck");
                self._$container.find("#parentName").textbox("setValue", app.utils.isNone(parent) ? "" : parent.name);
            },
            formatter: function (node) {
                return node.name;
            },
            loadFilter: function (data, parent) {//处理树节点状态。加载树的时候，根据子菜单数量决定书的状态，以便打开父节点时加载子节点
                $.each(data, function (index, item) {
                    item.state = item.childrenCount > 0 ? 'closed' : "open";
                });
                return data;
            }
        });
    };

    /**
     * 事件绑定
     */
    Menu.prototype._initEventBinding = function () {
        //对应菜单管理页保存按钮
        this._$container.find('#save_btn').on('click', {self: this}, this._actions.saveClick);
        //对应菜单管理页删除按钮
        this._$container.find('#delete_btn').on('click', {self: this}, this._actions.deleteClick);
        //对应菜单管理页添加按钮
        this._$container.find('#add_btn').on('click', {self: this}, this._actions.addClick);
        this._$container.find('#save_refresh').on('click', {self: this}, this._actions.refreshClick);
    };

    /**
     * 在此定义此js用到的事件处理方法。如处理按钮click事件的方法
     * @type {{btcClick: Function}}
     */
    Menu.prototype._actions = {
        /**
         * 保存菜单
         * @param evt
         */
        saveClick: function (evt) {
            //验证输入数据的完整性
            if (!app.utils.validateForm(evt.data.self._$container.find("#menu-form"))) {
                return false;
            }

            //从form获取json对象
            var params = app.utils.formToJSON(evt.data.self._$container.find("#menu-form"));
            params.active = params.active === "on" ? true : false;// easyui的switch button转换为boolean值
            params.readOnly = params.readOnly === "on" ? true : false;

            //将选中的节点的数据合并到params。因为form中未保存id等不可见信息，这些信息都存在于树节点中
            var node = evt.data.self._$container.find("#menu-tree").tree("getSelected");
            params = $.extend(true, {}, node, params);
            params.id = params.id.indexOf("newId-") > -1 ? null : params.id;//如果id是newId-开头的，表示这是一个新增节点，应该把id清空，由后台做insert操作
            console.log(params);
            if (params && params.params && params.params.indexOf("isEcode")) {
                var parObj = eval('(' + params.params + ')');
                if (parObj.opentype == "out" && parObj.isEcode == false && parObj.u && parObj.p) {
                    var b = new Base64();
                    parObj.u = b.encode(parObj.u);
                    parObj.p = b.encode(parObj.p);
                    parObj.isEcode = true;
                    params.params = JSON.stringify(parObj);
                }
            }
            //提交数据到后台
            $.ajax({
                url: evt.data.self.urlPaths.saveMenu,
                contentType: "application/json",
                type: "post",
                data: JSON.stringify(params),
                success: function (data) {//保存成功时，把后台返回的数据更新到树节点中。如：后台做的insert操作，此时需要把id更新到树节点中
                    params = $.extend(true, params, data);
                    evt.data.self._$container.find("#menu-tree").tree("update", params);
                    $.messager.alert('提示信息：', '菜单保存成功！');
                }
            })
        },
        //删除菜单按键
        deleteClick: function (evt) {
            var node = $('#menu-tree').tree('getSelected');
            if (app.utils.isNone(node)) {
                $.messager.alert('警告', '请先选择一个菜单再执行删除操作！');
                return false;
            }

            $.messager.confirm('确认', '是否确认删除菜单？', function (r) {
                if (r) {
                    $.ajax({
                        url: evt.data.self.urlPaths.removeMenu.replace("{id}", node.id),
                        type: "delete",
                        contentType: "application/json",
                        success: function () {
                            evt.data.self._$container.find('#menu-tree').tree('remove', node.target);
                            evt.data.self._$container.find('#menu-form').form("clear");
                            $.messager.alert('提示信息：', '删除菜单成功！');
                        }
                    });
                }
            });
        },

        /**
         * 新增菜单
         * 新增菜单时没有保存数据库，需要用户输入信息后点击保存按钮
         * @param evt
         * @returns {boolean}
         */
        addClick: function (evt) {
            var node = evt.data.self._$container.find("#menu-tree").tree("getSelected");
            if (app.utils.isNone(node)) {
                $.messager.alert('警告', '请先选择一个父菜单再执行新增操作！');
                return false;
            }


            //增加一个树节点
            var newId = "newId-" + (new Date()).getTime();//临时id
            evt.data.self._$container.find("#menu-tree").tree("append", {
                parent: node.target,
                data: [{
                    id: newId,
                    active: true,
                    name: "新增菜单（请修改信息，保存后生效）",
                    authType: node.authType,//菜单类型继承父菜单
                    parentSelf: node.id//父菜单是树上选中的节点
                }]
            });

            //选中新增的节点，触发树的onSelect事件，把信息显示到form中，用户编辑并保存后才会写到数据库
            var children = evt.data.self._$container.find("#menu-tree").tree("find", newId);
            evt.data.self._$container.find("#menu-tree").tree("select", children.target);
        },

        refreshClick: function (evt) {
            evt.data.self._$container.find("#menu-tree").tree('reload');
        }
    };

    return Menu;
});